package day_2022_4_to_7.nowcoder;

import java.util.Stack;

/**
 * 包含min函数的栈
 * @author haomin
 * @date 2022/04/20 17:18
 **/

// 加用一个辅助栈
public class TwoStackIncludeMin_17f {
    // 数据栈（存入栈元素）
    Stack<Integer> data_stack = new Stack<>();
    // 辅助栈（存入当前数据栈中元素最小值）
    Stack<Integer> min_stack = new Stack<>();

    public void push(int node) {
        // 先将node存入数据栈
        data_stack.push(node);

        // 判断辅助栈是否为空
        if(min_stack.isEmpty()){
            // 如果辅助栈为空，直接将node存入辅助栈
            min_stack.push(node);
        }else {
            // 如果辅助栈不为空，先将node和辅助栈的栈顶元素做比较
            // 将小的元素存入辅助栈
            if(min_stack.peek() <= node){
                // 辅助栈的栈顶元素更小
                min_stack.push(min_stack.peek());
            }else {
                // node 更小
                min_stack.push(node);
            }
        }
    }

    public void pop() {
        // 数据栈和辅助栈同时出栈，保证两栈元素个数一致
        data_stack.pop();
        min_stack.pop();
    }

    public int top() {
        return data_stack.peek();
    }

    // 当期数据栈中最小元素就是辅助栈的栈顶元素
    public int min() {
        return min_stack.peek();
    }
}